package com.liming.service.redisson;

import org.redisson.api.RLock;

import java.util.concurrent.TimeUnit;

/**
 * @author liming
 * @date 2025/3/7
 */
public interface RLocker {

    /**
     * 获取锁
     *
     * @param lockKey 锁Key
     * @return RLock
     */
    RLock lock(String lockKey);

    /**
     * 获取锁
     *
     * @param lockKey   锁Key
     * @param leaseTime 锁自动过期的时间 （秒）
     * @return RLock
     */
    RLock lock(String lockKey, long leaseTime);

    /**
     * 获取锁
     *
     * @param lockKey   锁Key
     * @param leaseTime 锁自动过期的时间
     * @param unit      时间单位
     * @return RLock
     */
    RLock lock(String lockKey, long leaseTime, TimeUnit unit);

    /**
     * 尝试获取锁 （参数内部定义） waitTime：100L, leaseTime：10L, TimeUnit.SECONDS
     *
     * @param lockKey 锁Key
     * @return 是否获取成功
     */
    boolean tryLock(String lockKey);

    /**
     * 尝试获取锁
     *
     * @param lockKey   锁Key
     * @param waitTime  获取锁可以等待的时间
     * @param leaseTime 锁自动过期的时间
     * @param unit      时间单位
     * @return 是否获取成功
     */
    boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit);

    /**
     * 释放锁
     *
     * @param lockKey 锁Key
     */
    void unlock(String lockKey);

    /**
     * 释放锁
     *
     * @param lock RLock锁
     */
    void unlock(RLock lock);
}
